package com.example.factory.data.helper;

import com.example.factory.model.db.AppDatabase;
import com.raizlabs.android.dbflow.config.DatabaseDefinition;
import com.raizlabs.android.dbflow.config.FlowManager;
import com.raizlabs.android.dbflow.structure.BaseModel;
import com.raizlabs.android.dbflow.structure.ModelAdapter;
import com.raizlabs.android.dbflow.structure.database.DatabaseWrapper;
import com.raizlabs.android.dbflow.structure.database.transaction.ITransaction;

import java.util.Arrays;

/**
 * Created by HongQian.Wang on 2017/10/7.
 */

public class DbHelper {

    private static final DbHelper instance;

    static {
        instance = new DbHelper();
    }

    private DbHelper() {
    }


    /**
     * 新增或者修改的统一方法
     *
     * @param tClass  传递一个Class信息
     * @param models  这个Class对应的实例的数组
     * @param <Model> 这个实例的范型，限定条件是BaseModel
     */
    public static <Model extends BaseModel> void save(final Class<Model> tClass,
                                                      final Model... models) {
        if (models == null || models.length == 0)
            return;

        // 当前数据库的一个管理者
        DatabaseDefinition definition = FlowManager.getDatabase(AppDatabase.class);
        // 提交一个事物
        definition.beginTransactionAsync(new ITransaction() {
            @Override
            public void execute(DatabaseWrapper databaseWrapper) {
                // 执行
                ModelAdapter<Model> adapter = FlowManager.getModelAdapter(tClass);
                // 保存
                adapter.saveAll(Arrays.asList(models));
//                 唤起通知
                instance.notifySave(tClass, models);
            }
        }).build().execute();
    }

    /**
     * 进行通知调用
     *
     * @param tClass  通知的类型
     * @param models  通知的Model数组
     * @param <Model> 这个实例的范型，限定条件是BaseModel
     */
    private final <Model extends BaseModel> void notifySave(final Class<Model> tClass,
                                                            final Model... models) {
//        // 找监听器
//        final Set<ChangedListener> listeners = getListeners(tClass);
//        if (listeners != null && listeners.size() > 0) {
//            // 通用的通知
//            for (ChangedListener<Model> listener : listeners) {
//                listener.onDataSave(models);
//            }
//        }
//
//        // 列外情况
//        if (GroupMember.class.equals(tClass)) {
//            // 群成员变更，需要通知对应群信息更新
//            updateGroup((GroupMember[]) models);
//        } else if (Message.class.equals(tClass)) {
//            // 消息变化，应该通知会话列表更新
//            updateSession((Message[]) models);
//        }
    }

    /**
     * 进行删除数据库的统一封装方法
     *
     * @param tClass  传递一个Class信息
     * @param models  这个Class对应的实例的数组
     * @param <Model> 这个实例的范型，限定条件是BaseModel
     */
    public static <Model extends BaseModel> void delete(final Class<Model> tClass,
                                                        final Model... models) {
//        if (models == null || models.length == 0)
//            return;
//
//        // 当前数据库的一个管理者
//        DatabaseDefinition definition = FlowManager.getDatabase(AppDatabase.class);
//        // 提交一个事物
//        definition.beginTransactionAsync(new ITransaction() {
//            @Override
//            public void execute(DatabaseWrapper databaseWrapper) {
//                // 执行
//                ModelAdapter<Model> adapter = FlowManager.getModelAdapter(tClass);
//                // 删除
//                adapter.deleteAll(Arrays.asList(models));
//                // 唤起通知
//                instance.notifyDelete(tClass, models);
//            }
//        }).build().execute();
    }
}
